package main

import (
	"log"
	"net/http"
	"time"

	"github.com/gin-gonic/gin"
)

func (h *Handler) handleItemClear(c *gin.Context) {
	ItemCLear(h.Db)
	Success(c, nil)
}

func (h *Handler) handleItemPost(c *gin.Context) {
	var item Item
	if err := c.ShouldBindJSON(&item); err != nil {
		Error(c, http.StatusBadRequest, "无效的JSON格式")
		return
	}

	// 验证必填字段
	if item.Model == "" {
		Error(c, http.StatusBadRequest, "型号(model)是必填字段")
		return
	}

	// 检查model是否已存在
	if ItemCountByModel(h.Db, item.Model) > 0 {
		Error(c, http.StatusCreated, "物料型号已存在")
		return
	}

	// 如果提供了code，检查code是否已存在
	if item.Code != "" && ItemCount(h.Db, item.Code) > 0 {
		Error(c, http.StatusCreated, "物料编码已存在")
		return
	}

	// 设置时间戳
	now := time.Now()
	item.CreatedAt = now
	item.UpdatedAt = now

	if err := ItemAdd(h.Db, item); err != nil {
		Error(c, http.StatusInternalServerError, "新增失败")
		return
	}
	log.Printf("成功新增: %+v", item)
	Success(c, "已新增数据")
}

func (h *Handler) handleItemGet(c *gin.Context) {
	items, err := ItemGetAll(h.Db)
	ck(err)
	Success(c, items)
}

func (h *Handler) handleItemPut(c *gin.Context) {
	var item Item
	if err := c.ShouldBindJSON(&item); err != nil {
		Error(c, http.StatusBadRequest, "无效的JSON格式")
		return
	}

	// 验证必填字段
	if item.Model == "" {
		Error(c, http.StatusBadRequest, "型号(model)是必填字段")
		return
	}

	// 检查是否存在此物料（通过code或model）
	if item.Code != "" && ItemCount(h.Db, item.Code) == 0 {
		Error(c, http.StatusNotImplemented, "不存在此物料")
		return
	}

	// 设置更新时间
	item.UpdatedAt = time.Now()

	if err := ItemUpdate(h.Db, item); err != nil {
		Error(c, http.StatusInternalServerError, "修改失败")
		return
	}
	log.Printf("成功修改: %+v", item)
	Success(c, "已修改数据")
}

func (h *Handler) handleItemDelete(c *gin.Context) {
	var item Item
	if err := c.ShouldBindJSON(&item); err != nil {
		Error(c, http.StatusBadRequest, "无效的JSON格式")
		return
	}

	// 检查是否提供了code或model
	if item.Code == "" && item.Model == "" {
		Error(c, http.StatusBadRequest, "删除操作需要提供物料编码(code)或型号(model)")
		return
	}

	// 优先使用code删除，如果没有code则使用model
	if item.Code != "" {
		if ItemCount(h.Db, item.Code) == 0 {
			Error(c, http.StatusNotImplemented, "不存在此物料编码")
			return
		}
		if err := ItemDel(h.Db, item.Code); err != nil {
			Error(c, http.StatusInternalServerError, "删除失败")
			return
		}
		log.Printf("成功删除物料编码: %s", item.Code)
	} else {
		if ItemCountByModel(h.Db, item.Model) == 0 {
			Error(c, http.StatusNotImplemented, "不存在此物料型号")
			return
		}
		if err := ItemDelByModel(h.Db, item.Model); err != nil {
			Error(c, http.StatusInternalServerError, "删除失败")
			return
		}
		log.Printf("成功删除物料型号: %s", item.Model)
	}

	Success(c, "已删除数据")
}
